package cn.tedu.st.security.service.Impl;

import cn.tedu.st.security.mapper.MenuMapper;
import cn.tedu.st.security.mapper.UserMapper;
import cn.tedu.st.security.pojo.entity.User;
import cn.tedu.st.security.pojo.vo.UserDetailsImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.Objects;

/**
 * UserDetailsService 的作用 ：根据用户名加载用户信息，用于认证和授权。
 * 核心方法 ：loadUserByUsername，返回一个 UserDetails 对象。
 * 工作流程 ：Spring Security 调用 UserDetailsService 加载用户信息，验证密码并完成认证。
 * 实际应用 ：通常结合数据库或其他数据源实现，用于动态加载用户信息。
 */
@Service
@Slf4j
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private MenuMapper menuMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException , InternalAuthenticationServiceException{
        log.debug("进入UserDetailsServiceImpl-------");
        //如果
        if (username.trim().isEmpty()){
            log.debug("UserDetailsServiceImpl中，表单传过来的用户名为空={}",username);
            //用户名为空
            throw new InternalAuthenticationServiceException("用户名不能为空！");
        }
        //根据用户名查找用户信息
        User user = userMapper.selectUserByUsername(username);
        if (Objects.isNull(user)){
            //用户名或密码错误
            log.debug("在UserDetailsServiceImpl中根据用户名查询用户信息失败，用户名不存在！");
            throw new UsernameNotFoundException("用户名不存在！");
        }
        List<String> list = menuMapper.selectPermsByUserId(user.getId());


        log.debug("在UserDetailsServiceImpl中调用menuMapper.selectPermsByUserId({})根据用户id查询权限信息：{}",user.getId(),list);
        log.debug("在UserDetailsServiceImpl中根据用户名查询用户信息成功，返回UserDetailsImpl对象");


        return new UserDetailsImpl(user,list);
    }
}
